import { Express } from "express";
const jwt = require("jsonwebtoken");
import { tokenKey } from "./config/config";
export default function middle(app: Express) {
  //app.use可以看作是一个路由守卫，请求会先进入use方法，如果use方法返回false，则不会进入下一个方法
  //如果执行next()可以进行下一个方法，一般可以做一些请求拦截
  //比如token校验
  //   设置不需要校验token的url路径(白名单)
  let whiteUrl = /(\/api\/login)|(\/api\/loginblogUser)/;
  app.use(function (req, res, next: () => void) {
    // 如果符合白名单路由，则直接进入下一个办法
    if (whiteUrl.test(req.url)) {
      next();
      return;
    }
    const { authorization } = req.headers;
    console.log(authorization);
    //如果没有token，则返回403并且提醒用户没有token
    if (!authorization) {
      res.status(403).send({ success: false, message: "没有token" });
      return;
    }
    jwt.verify(authorization, tokenKey, function (err: Error, result: any) {
      if (err) {
        res.status(403).send({ success: false, message: "token无效" });
        return;
      }
      //id是token加密的用户id，iat是当前的时间戳，exp token设置的过期时间
      const { id, iat, exp } = result;
      console.log(id);

      if (exp < iat) {
        // 如果token的过期时间小于当前时间说明token已经过期
        res.status(403).send({ success: false, message: "token过期" });
        return;
      }
      //    给req对象添加一个uid属性存储用户id 后面的路由如果要用当前登录的id值
      //   直接从req中取id
      (req as any).uids = id;
      next();
    });
  });
}
